﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Entidades;
using ADOConectado;
using System.Data.SqlClient;
using System.Data;

namespace ADOConectado
{
    public static class dbVentas
    {

        public static List<VentaRealizada> ListarVentasRealizadas(int? IdMes, DateTime? fechaVenta, string nombre, string apellido, string producto, string marca, string modelo)
        {

            string Anticipo;
            int? cantCuotas;
            decimal? ValorCuota;
            string NombreCliente;
            string apellidoCliente;
            List<VentaRealizada> lstVentasRealizadas = new List<VentaRealizada>();
            SqlConnection objConexion = new SqlConnection(Conexiones.StringConexion);
            objConexion.Open();
            SqlCommand dataCommand = new SqlCommand("ListarVentas", objConexion);
            dataCommand.CommandType = CommandType.StoredProcedure;
            dataCommand.Parameters.AddWithValue("@intIdMes", IdMes);
            dataCommand.Parameters.AddWithValue("@datfechaVenta", fechaVenta);
            dataCommand.Parameters.AddWithValue("@varNombreCliente", nombre);
            dataCommand.Parameters.AddWithValue("@varApellidoCliente", apellido);
            dataCommand.Parameters.AddWithValue("@varProducto", producto);
            dataCommand.Parameters.AddWithValue("@varMarca", marca);
            dataCommand.Parameters.AddWithValue("@varModelo", modelo);

            SqlDataReader objReader = dataCommand.ExecuteReader();

            try
            {
                while (objReader.Read())
                {
                    if (objReader["Anticipo"] == System.DBNull.Value)
                        Anticipo = string.Empty;
                    else
                        Anticipo = objReader["Anticipo"].ToString();

                    if (objReader["Cuotas"] == System.DBNull.Value)
                        cantCuotas = 0;
                    else
                        cantCuotas = Convert.ToInt32(objReader["Cuotas"]);

                    if (objReader["Valor"] == System.DBNull.Value)
                        ValorCuota = 0;
                    else
                        ValorCuota = Convert.ToDecimal(objReader["Valor"]);

                    if (objReader["Nombre"] == System.DBNull.Value)
                        NombreCliente = string.Empty;
                    else
                        NombreCliente = objReader["Nombre"].ToString();

                    if (objReader["Apellido"] == System.DBNull.Value)
                        apellidoCliente = string.Empty;
                    else
                        apellidoCliente = objReader["Apellido"].ToString();

                    VentaRealizada objVentaRealizada = new VentaRealizada(Convert.ToInt32(objReader["idVenta"]), objReader["Cantidad"].ToString(), objReader["Producto"].ToString(), objReader["Marca"].ToString(), objReader["Modelo"].ToString(),NombreCliente, apellidoCliente, Convert.ToDateTime(objReader["Fecha"]), Anticipo, cantCuotas, ValorCuota, Convert.ToDecimal(objReader["Monto"]), Convert.ToInt32(objReader["IdTipoDeVenta"]));
                    //Venta objVenta = new Venta(objReader["intIVenta"].ToString(), objReader["intCodProd"].ToString(), objReader["varNombreProducto"].ToString(), objReader["varMarca"].ToString(), objReader["varModelo"].ToString(), objReader["intDni"].ToString(), objReader["intCantidad"].ToString(), objReader["varModoPago"].ToString(), objReader["decAnticipo"].ToString(), objReader["intCantCuotas"].ToString(), objReader["intNumeroCuotaPaga"].ToString(), objReader["decPrecioContado"].ToString(), objReader["varTipoDeCuota"].ToString(), objReader["decValorCuota"].ToString(), Convert.ToDateTime(objReader["datFechaVenta"]), (objReader["varNroFactura"]).ToString());
                    // Venta objVenta = new Venta(Convert.ToInt32(objReader["intIdVenta"]), Convert.ToInt32(objReader["intCodProd"]), objReader["varNombreProducto"].ToString(), objReader["varMarca"].ToString(), objReader["varModelo"].ToString(), Convert.ToInt32(objReader["intDni"]), Convert.ToInt32(objReader["intCantidad"]), objReader["varModoPago"].ToString(), Convert.ToDecimal(objReader["decAnticipo"]), Convert.ToInt32(objReader["intCantCuotas"]), Convert.ToInt32(objReader["intNumeroCuotaPaga"]), Convert.ToDecimal(objReader["decPrecioContado"]), objReader["varTipoDeCuota"].ToString(), Convert.ToDecimal(objReader["decValorCuota"]), Convert.ToDateTime(objReader["datFechaVenta"]), (objReader["varNroFactura"]).ToString());
                    lstVentasRealizadas.Add(objVentaRealizada);
                }

                return lstVentasRealizadas;
            }
            catch (Exception ex)
            {
                throw new System.ArgumentException("Parameter cannot be null", "original");
            }
            finally
            {
                objConexion.Close();
            }
 
        }
        public static List<Venta> Listar(string paramCodProd, string paramMarca, string paramNomProd , DateTime? paramFechaVenta)
        {
            List<Venta> lstVentas = new List<Venta>();
            SqlConnection objConexion = new SqlConnection(Conexiones.StringConexion);
            objConexion.Open();
            SqlCommand dataCommand = new SqlCommand("BuscarVentas1", objConexion);
            dataCommand.CommandType = CommandType.StoredProcedure;

            dataCommand.Parameters.AddWithValue("@datFechaVenta", paramFechaVenta);

            if (paramCodProd != "")
                dataCommand.Parameters.AddWithValue("@intCodProd", Convert.ToInt32(paramCodProd));
            else
                dataCommand.Parameters.AddWithValue("@intCodProd", System.DBNull.Value);
            if (paramNomProd != "")
                dataCommand.Parameters.AddWithValue("@varNombreProducto", paramNomProd);
            else
                dataCommand.Parameters.AddWithValue("@varNombreProducto", System.DBNull.Value);
            if (paramMarca != "")
                dataCommand.Parameters.AddWithValue("@varMarca", paramMarca);
            else
                dataCommand.Parameters.AddWithValue("@varMarca", System.DBNull.Value);

            SqlDataReader objReader = dataCommand.ExecuteReader();

            try
            {
                while (objReader.Read())
                {

                    Venta objVenta = new Venta(objReader["intIdVenta"].ToString(), objReader["intCodProd"].ToString(), objReader["varNombreProducto"].ToString(), objReader["varMarca"].ToString(), objReader["varModelo"].ToString(), objReader["intDni"].ToString(), objReader["intCantidad"].ToString(), objReader["varModoPago"].ToString(), objReader["decAnticipo"].ToString(), objReader["intCantCuotas"].ToString(), objReader["intNumeroCuotaPaga"].ToString(), objReader["decPrecioContado"].ToString(), objReader["varTipoDeCuota"].ToString(), objReader["decValorCuota"].ToString(), Convert.ToDateTime(objReader["datFechaVenta"]), (objReader["varNroFactura"]).ToString());
                    // Venta objVenta = new Venta(Convert.ToInt32(objReader["intIdVenta"]), Convert.ToInt32(objReader["intCodProd"]), objReader["varNombreProducto"].ToString(), objReader["varMarca"].ToString(), objReader["varModelo"].ToString(), Convert.ToInt32(objReader["intDni"]), Convert.ToInt32(objReader["intCantidad"]), objReader["varModoPago"].ToString(), Convert.ToDecimal(objReader["decAnticipo"]), Convert.ToInt32(objReader["intCantCuotas"]), Convert.ToInt32(objReader["intNumeroCuotaPaga"]), Convert.ToDecimal(objReader["decPrecioContado"]), objReader["varTipoDeCuota"].ToString(), Convert.ToDecimal(objReader["decValorCuota"]), Convert.ToDateTime(objReader["datFechaVenta"]), (objReader["varNroFactura"]).ToString());
                    lstVentas.Add(objVenta);
                }

                return lstVentas;
            }
            catch (Exception ex)
            {
                throw new System.ArgumentException("Parameter cannot be null", "original");
            }
            finally
            {
                objConexion.Close();
            }

        }

        public static void InsertarVentaAlContado(int? IdCliente, DateTime fechaVenta)
        {
            SqlConnection objConexion = new SqlConnection(Conexiones.StringConexion);
            objConexion.Open();
            SqlCommand dataCommand = new SqlCommand("InsertarVentaAlContado", objConexion);
            dataCommand.CommandType = CommandType.StoredProcedure;
            dataCommand.Parameters.AddWithValue("@intIdCliente", IdCliente);
            dataCommand.Parameters.AddWithValue("@datFechaDeVenta", fechaVenta);
            SqlDataReader objReader = dataCommand.ExecuteReader();
            objConexion.Close();

 
        }
        public static void InsertarProductosVendidosAlContado(int paramIdProd, int paramCantidad, decimal precioVenta)
        {
            SqlConnection objConexion = new SqlConnection(Conexiones.StringConexion);
            objConexion.Open();
            SqlCommand dataCommand = new SqlCommand("InsertarProductosVendidosAlContado", objConexion);
            dataCommand.CommandType = CommandType.StoredProcedure;
            dataCommand.Parameters.AddWithValue("@intCodProd", paramIdProd);
            dataCommand.Parameters.AddWithValue("@intCantidad", paramCantidad);
            dataCommand.Parameters.AddWithValue("@decPrecioContadoDeVenta", precioVenta);
            SqlDataReader objReader = dataCommand.ExecuteReader();
            objConexion.Close();
        }
        public static void InsertarVentaEnCuotas(int? idCliente, int cantCuotas, decimal anticipo, int idTipoDeCuota, DateTime fechaVenta, decimal valorCuota)
        {
            SqlConnection objConexion = new SqlConnection(Conexiones.StringConexion);
            objConexion.Open();
            SqlCommand dataCommand = new SqlCommand("InsertarVentaEnCuotas", objConexion);
            dataCommand.CommandType = CommandType.StoredProcedure;
            dataCommand.Parameters.AddWithValue("@intIdCliente", idCliente);
            dataCommand.Parameters.AddWithValue("@intCantCuotas", cantCuotas);
            dataCommand.Parameters.AddWithValue("@decValorCuota", valorCuota);
            dataCommand.Parameters.AddWithValue("@decAnticipo", anticipo);
            dataCommand.Parameters.AddWithValue("@intIdTipoDeCuota", idTipoDeCuota);
            dataCommand.Parameters.AddWithValue("@datFechaVenta", fechaVenta);
            SqlDataReader objReader = dataCommand.ExecuteReader();
            objConexion.Close();

        }
        public static void InsertarProductosVendidosEnCuotas(int IdProducto, int Cantidad, decimal precioVentaContadoUd)
        {
            SqlConnection objConexion = new SqlConnection(Conexiones.StringConexion);
            objConexion.Open();
            SqlCommand dataCommand = new SqlCommand("InsertarProductosVendidosEnCuotas", objConexion);
            dataCommand.CommandType = CommandType.StoredProcedure;
            dataCommand.Parameters.AddWithValue("@intCodProd", IdProducto);
            dataCommand.Parameters.AddWithValue("@intCantidad", Cantidad);
            dataCommand.Parameters.AddWithValue("@decPrecioContadoDeVenta", precioVentaContadoUd);
            SqlDataReader objReader = dataCommand.ExecuteReader();
            objConexion.Close();
 
        }

        public static void CrearCobranzaNueva(int? paramIdCliente,int paramCantCuotas,decimal paramAnticipo,int paramIdTipoDeCuota,decimal paramValorCuota)
        {
                            
                SqlConnection objConexion = new SqlConnection(Conexiones.StringConexion);
                objConexion.Open();
                SqlCommand dataCommand = new SqlCommand("CrearUnaCobranzaNueva", objConexion);
                dataCommand.CommandType = CommandType.StoredProcedure;
                dataCommand.Parameters.AddWithValue("@intIdCliente", paramIdCliente);
                dataCommand.Parameters.AddWithValue("@intCantCuotas", paramCantCuotas);
                dataCommand.Parameters.AddWithValue("@decAnticipo", paramAnticipo);
                dataCommand.Parameters.AddWithValue("@intIdTipoDeCuota", paramIdTipoDeCuota);
                dataCommand.Parameters.AddWithValue("@decValorCuota", paramValorCuota);
                SqlDataReader objReader = dataCommand.ExecuteReader();
                objConexion.Close();
                        
        }

        public static void RealizarVentaEnCuotas(int paramIdProd, int paramCantidad,decimal precioVenta,int? paramIdCliente )
        {

            SqlConnection objConexion = new SqlConnection(Conexiones.StringConexion);
            objConexion.Open();
            SqlCommand dataCommand = new SqlCommand("RealizarVentaEnCuotas", objConexion);
            dataCommand.CommandType = CommandType.StoredProcedure;
            dataCommand.Parameters.AddWithValue("@intIdCliente", paramIdCliente);
            dataCommand.Parameters.AddWithValue("@intCodProd", paramIdProd);
            dataCommand.Parameters.AddWithValue("@intCantidad", paramCantidad);
            dataCommand.Parameters.AddWithValue("@decPrecioContadoDeVenta", precioVenta);
            SqlDataReader objReader = dataCommand.ExecuteReader();
 
        }

        public static void  RealizarVenta(int idCliente, int idProducto, DateTime fechaVenta,int idTipoVenta, int cant, decimal precioPorUnidad)
        {
            SqlConnection objConexion = new SqlConnection(Conexiones.StringConexion);
            objConexion.Open();
            SqlCommand dataCommand = new SqlCommand("RealizarVenta", objConexion);
            dataCommand.CommandType = CommandType.StoredProcedure;
            dataCommand.Parameters.AddWithValue("@intIdCliente", idCliente);
            dataCommand.Parameters.AddWithValue("@intCodProd", idProducto);
            dataCommand.Parameters.AddWithValue("@intIdTipoDeVenta", idTipoVenta);
            dataCommand.Parameters.AddWithValue("@intCantProdVendidos", cant);
            dataCommand.Parameters.AddWithValue("@decPrecioContadoPorUnidad", precioPorUnidad);
            dataCommand.Parameters.AddWithValue("@varNroFactura", System.DBNull.Value);
            dataCommand.Parameters.AddWithValue("@datFechaVenta", fechaVenta);
            SqlDataReader objReader = dataCommand.ExecuteReader();
            objConexion.Close();
        }

        public static void RegistrarVenta(DateTime paramFechaVenta, decimal paramPrecioContado, int paramCodProd, int paramCant, string paramNroFactura, string paramDni, string paramModoPago, decimal paramAnticipo, int paramCantCuotas, int paramNroCuotaPaga, string paramTipoCuota, decimal paramValorCuota)
        {
            DateTime fechaDeVenta = paramFechaVenta;
            SqlConnection objConexion = new SqlConnection(Conexiones.StringConexion);
            objConexion.Open();
            SqlCommand dataCommand = new SqlCommand("RegistrarVenta", objConexion);
            dataCommand.CommandType = CommandType.StoredProcedure;

            if (paramNroFactura != "")
                dataCommand.Parameters.AddWithValue("@varNroFactura", paramNroFactura);
            else
                dataCommand.Parameters.AddWithValue("@varNroFactura", System.DBNull.Value);
            if (paramAnticipo > 0)
                dataCommand.Parameters.AddWithValue("@decAnticipo", paramAnticipo);
            else
                dataCommand.Parameters.AddWithValue("@decAnticipo", System.DBNull.Value);
            if (paramCantCuotas > 0)
                dataCommand.Parameters.AddWithValue("@intCantCuotas", paramCantCuotas);
            else
                dataCommand.Parameters.AddWithValue("@intCantCuotas", System.DBNull.Value);
            if (paramNroCuotaPaga > 0)
                dataCommand.Parameters.AddWithValue("@intNumeroCuotaPaga", paramNroCuotaPaga);
            else
                dataCommand.Parameters.AddWithValue("@intNumeroCuotaPaga", System.DBNull.Value);
            if (paramValorCuota > 0)
                dataCommand.Parameters.AddWithValue("@decValorCuota", paramValorCuota);
            else
                dataCommand.Parameters.AddWithValue("@decValorCuota", System.DBNull.Value);
            if (paramTipoCuota != "")
                dataCommand.Parameters.AddWithValue("@varTipoDeCuota", paramTipoCuota);
            else
                dataCommand.Parameters.AddWithValue("@varTipoDeCuota", System.DBNull.Value);
            if (paramDni != "")
                dataCommand.Parameters.AddWithValue("@intDni",Convert.ToInt32(paramDni));
            else
                dataCommand.Parameters.AddWithValue("@intDni", System.DBNull.Value);

            dataCommand.Parameters.AddWithValue("@decPrecioContado", paramPrecioContado);
            dataCommand.Parameters.AddWithValue("@intCantidad", paramCant);
            dataCommand.Parameters.AddWithValue("@intCodProd", paramCodProd);
            dataCommand.Parameters.AddWithValue("@datFechaVenta",fechaDeVenta);
           
            dataCommand.Parameters.AddWithValue("@varModoPago", paramModoPago);

            SqlDataReader objReader = dataCommand.ExecuteReader();
            objConexion.Close();
            insertarCobranzas(paramModoPago,paramCantCuotas,paramNroCuotaPaga,paramDni,fechaDeVenta,paramTipoCuota);
            

        }

        public static void EliminarVenta(int IdVenta)
        {
            SqlConnection objConexion1 = new SqlConnection(Conexiones.StringConexion);
            objConexion1.Open();
            SqlCommand dataCommand1 = new SqlCommand("EliminarVenta", objConexion1);
            dataCommand1.CommandType = CommandType.StoredProcedure;
            dataCommand1.Parameters.AddWithValue("@intIdVenta", IdVenta);
            SqlDataReader objReader1 = dataCommand1.ExecuteReader();
            objConexion1.Close();
        }
        public static void insertarCobranzas(string paramModoPago,int paramCantCuotas,int paramNroCuotaPaga,string paramDni,DateTime fechaDeVenta,string paramTipoCuota)
        {
            if (paramModoPago == "Cuotas")
            {
                int cantidadDeCuotas = paramCantCuotas;
                int nroCuotaEnCurso = paramNroCuotaPaga;
                nroCuotaEnCurso = 0;
                nroCuotaEnCurso = nroCuotaEnCurso + 1;
                while (cantidadDeCuotas >= nroCuotaEnCurso)
                {
                    SqlConnection objConexion1 = new SqlConnection(Conexiones.StringConexion);
                    objConexion1.Open();
                    SqlCommand dataCommand1 = new SqlCommand("InsertarCobranza", objConexion1);
                    dataCommand1.CommandType = CommandType.StoredProcedure;

                    dataCommand1.Parameters.AddWithValue("@paramDni", paramDni);
                    dataCommand1.Parameters.AddWithValue("@paramNroCuota", nroCuotaEnCurso);
                    //dataCommand.Parameters.AddWithValue("@paramFechaVto", );
                    dataCommand1.Parameters.AddWithValue("@paramLeyendaPago", "FALTA PAGAR");
                    if (paramTipoCuota == "Cuotas Mensuales")
                    {
                        DateTime fechVto = fechaDeVenta.AddMonths(nroCuotaEnCurso);
                        dataCommand1.Parameters.AddWithValue("@paramFechaVto", new DateTime(fechVto.Year, fechVto.Month, fechVto.Day, 23, 59, 59));
                    }
                    else
                    {
                        DateTime fechVto = fechaDeVenta.AddDays(nroCuotaEnCurso * 7);
                        dataCommand1.Parameters.AddWithValue("@paramFechaVto", new DateTime(fechVto.Year,fechVto.Month,fechVto.Day,23,59,59));
                    }
                    SqlDataReader objReader1 = dataCommand1.ExecuteReader();
                    objConexion1.Close();
                    nroCuotaEnCurso = nroCuotaEnCurso + 1;
                }
            }
        }


        public static  void ModificarFechaVenta(DateTime fechaVentaCorrecta , int IdVenta)
        {
            SqlConnection objConexion = new SqlConnection(Conexiones.StringConexion);
            objConexion.Open();
            SqlCommand dataCommand = new SqlCommand("ModificarFechaVenta", objConexion);
            dataCommand.CommandType = CommandType.StoredProcedure;

            dataCommand.Parameters.AddWithValue("@datFechaVentaCorrecta", fechaVentaCorrecta);
            dataCommand.Parameters.AddWithValue("@IdVenta", IdVenta);
            SqlDataReader objReader = dataCommand.ExecuteReader();
            objConexion.Close();
        }

    
    }  
}
